package com.hutao.example.wardemo.file;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.*;
import java.util.Collection;

@MultipartConfig(
        fileSizeThreshold = 1024 * 1024 * 20,  // 2MB 内存阈值，超过则写入临时文件
        maxFileSize = 1024 * 1024 * 10,       // 单个文件最大 10MB
        maxRequestSize = 1024 * 1024 * 50   // 整个请求最大 50MB（多文件总和）
)
public class UploadServlet extends HttpServlet {

    // 上传文件存储目录（需提前创建，或在代码中判断创建）
    private static final String UPLOAD_DIR = "D:/uploadFiles";

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //设置请求编码 放在文件名乱码
        request.setCharacterEncoding("UTF-8");
        // 1. 设置响应编码
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        // 2. 验证请求是否为 multipart/form-data 类型
        if (!request.getContentType().startsWith("multipart/")) {
            out.write("请使用 multipart/form-data 表单提交！");
            return;
        }

        // 3. 创建上传目录（若不存在）
        java.io.File uploadDir = new java.io.File(UPLOAD_DIR);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs(); // 递归创建目录
        }
        //绝对路径

        try {
            // 3. 处理每个文件
            for (Part part : request.getParts()) {
                String fileName = part.getSubmittedFileName();
                if (fileName == null || fileName.trim().isEmpty()) {
                    continue;
                }

                // 生成唯一文件名
                String uniqueFileName = fileName;
                // 构造目标文件路径
                String filePath = UPLOAD_DIR + File.separator + uniqueFileName;
                File targetFile = new File(filePath);

                // 4. 手动写入文件（关键：避免 WebSphere 路径拼接问题）
                InputStream in = part.getInputStream();
                OutputStream outStream = new FileOutputStream(targetFile);
                byte[] buffer = new byte[1024];
                int len;
                while ((len = in.read(buffer)) != -1) {
                    outStream.write(buffer, 0, len);
                }
                outStream.close();
                in.close();

                out.write("文件上传成功！存储路径：" + filePath);
            }
        }  catch (Exception e) {
            out.write("文件上传失败！原因：" + e.getMessage());
            e.printStackTrace();
        } finally {
            out.close();
        }

        //相对路径
//        try {
//
//            // 5. 获取所有上传文件的 Part 对象
//            Collection<Part> parts = request.getParts();
//            out.write("共上传 " + parts.size() + " 个文件（含普通字段）<br>");
//
//            // 6. 遍历处理每个 Part（过滤普通表单字段，只处理文件）
//            for (Part part : parts) {
//                // 获取表单字段名（区分普通字段和文件字段）
//                String fieldName = part.getName();
//                // 获取上传文件的原始文件名（Servlet 3.1+ 支持，若为普通字段则返回 null）
//                String fileName = part.getSubmittedFileName();
//
//                // 只处理文件字段（fileName 不为 null 且不为空）
//                if (fileName != null && !fileName.trim().isEmpty()) {
//                    out.write("处理文件：" + fileName + "<br>");
//                    out.write("文件大小：" + part.getSize() + " 字节<br>");
//                    out.write("文件类型：" + part.getContentType() + "<br>");
//
//                    // 7. 避免文件名重复：生成唯一文件名（例如：时间戳 + 原始文件名）
//                    String uniqueFileName = fileName;
//                    // 拼接文件存储路径
//                    String filePath = uniqueFileName;
//
//                    // 8. 将文件写入指定路径（Part.write() 会自动处理流的关闭）
//                    part.write(filePath);
//
//                    out.write("文件上传成功！存储路径：" + filePath + "<br><br>");
//                }
//            }
//
//        } catch (Exception e) {
//            out.write("文件上传失败！原因：" + e.getMessage());
//            e.printStackTrace();
//        } finally {
//            out.close();
//        }
    }
}
